#ifndef __QUATERNION_CLASS_DEFINE__
#define __QUATERNION_CLASS_DEFINE__
#pragma once
#include "framework.h"
#include "VectorInformation.h"
/*
 四元数表示方式：
 1.q=[w v] 标量m和一个向量表示
 2.q=[w x y z]或者4个标量 m,x,y,z来表示一个四元数

 单位四元数[1 0 0 0]:表示没有旋转
*/
// 四元数描述类
class Quaternion
{
public:
    Quaternion();
    Quaternion(double w, double x, double y, double z);
    // 转换成单位四元数
    VOID ToIdentityQuaternion();
    // 绕xyz轴旋转
    VOID RotationAroundXYZAxis(ROTATE_TYPE rotateType, double angle);
    // 绕任意轴旋转
    VOID RotationAboutAnyAxis(VectorInformation& VectorInfo, double angle);
    // 计算当前四元数的模
    double SquareQuaternion();
    // 根据四元数计算旋转角
    double GetRotationAngle();
    // 根据四元数计算旋转轴
    VectorInformation GetRotationAxis();
    // 是四元数规范化
    VOID normalize();


    double GetW() { return w; }
    double GetX() { return x; }
    double GetY() { return y; }
    double GetZ() { return z; }
private:
    double w;
    double x;
    double y;
    double z;

};

Quaternion operator*(Quaternion& q1, Quaternion& q2);
// 计算四元数的点乘
double QuaternionPointMultiplication(Quaternion& q1, Quaternion& q2);
// 计算四元数的共轭
Quaternion QuaternionConjugate(Quaternion& q);
// 计算四元数的幂
Quaternion PowerOfQuaternion(Quaternion& q, double exponent);


#endif // !__QUATERNION_CLASS_DEFINE__
